﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ArtMath.Core.Helper
{
    /// <summary>
    /// 线性代数相关工具
    /// </summary>
    public static class LinearAlgebra
    {
        public static decimal GetDeterminantValue(int[,] det)
        {
            int rowCount = det.GetLength(0), colCount = det.GetLength(1);
            if (rowCount != colCount) throw new ArgumentException("Invalid Determinant");
            decimal ans = 1;
            int sign = 0;
            for (int i = 0; i < rowCount; i++)//当前行
            {
                for (int j = i + 1; j < colCount; j++)//当前之后的每一行，因为每一行的当前第一个数要转化成0（想想线性代数中行列式的计算）
                {
                    int x = i, y = j;
                    while (det[y, i] != 0)//利用gcd的方法，不停地进行辗转相除
                    {
                        int t = det[x, i] / det[y, i];
                        for (int k = i; k < colCount; k++)
                        {
                            det[x, k] -= det[y, k] * t;
                        }
                        Utility.Swap(ref x, ref y);
                    }
                    if (x != i)//奇数次交换，则D=-D'整行交换
                    {
                        for (int k = 0; k < colCount; k++)
                        {
                            Utility.Swap(ref det[i, k], ref det[x, k]);
                        }
                        sign ^= 1;
                    }
                }
                if (det[i, i] == 0)//斜对角中有一个0，则结果为0
                {
                    return 0;
                }
                else
                {
                    ans *= det[i, i];
                }
            }
            if (sign != 0) ans = -ans;
            return ans;
        }
        public static decimal[] SolveLinearEquations()
        {
            return null;
        }
    }
}
